home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / render / renderGL.cpp < prev   
Encoding:
C/C++ Source or Header  |  2000-12-12  |  9.1 KB  |  311 lines

  1. #include "../Fly3D.h"
  2.  
  3. /* ARB_multitexture command function pointers */
  4. FLY_API PFNGLMULTITEXCOORD2IARBPROC glMultiTexCoord2iARB;
  5. FLY_API PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
  6. FLY_API PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB;
  7. FLY_API PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB;
  8. FLY_API PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB;
  9. FLY_API PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
  10.  
  11. /* NV_register_combiners command function pointers */
  12. FLY_API PFNGLCOMBINERPARAMETERFVNVPROC glCombinerParameterfvNV;
  13. FLY_API PFNGLCOMBINERPARAMETERIVNVPROC glCombinerParameterivNV;
  14. FLY_API PFNGLCOMBINERPARAMETERFNVPROC glCombinerParameterfNV;
  15. FLY_API PFNGLCOMBINERPARAMETERINVPROC glCombinerParameteriNV;
  16. FLY_API PFNGLCOMBINERINPUTNVPROC glCombinerInputNV;
  17. FLY_API PFNGLCOMBINEROUTPUTNVPROC glCombinerOutputNV;
  18. FLY_API PFNGLFINALCOMBINERINPUTNVPROC glFinalCombinerInputNV;
  19. FLY_API PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC glGetCombinerInputParameterfvNV;
  20. FLY_API PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC glGetCombinerInputParameterivNV;
  21. FLY_API PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC glGetCombinerOutputParameterfvNV;
  22. FLY_API PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC glGetCombinerOutputParameterivNV;
  23. FLY_API PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC glGetFinalCombinerInputfvNV;
  24. FLY_API PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC glGetFinalCombinerInputivNV;
  25.  
  26. void FlyGetProfile(LPTSTR section, LPTSTR key, LPBYTE lpData, DWORD cbData);
  27.  
  28. int renderGL::CreateView()
  29. {
  30.     int i,j;
  31.     
  32.     hdc=GetDC(hFlyWnd);
  33.     colorbits=GetDeviceCaps(hdc,BITSPIXEL);
  34.  
  35.     int color;
  36.     FlyGetProfile("Settings","colorbits", (unsigned char *)&color, sizeof(int));
  37.     if (colorbits!=color)
  38.     {
  39.         MessageBox(hFlyWnd,"Fly3D render configuration not set or display color depth has been changed.\nShould run flyConfig.exe to select a new render mode.","Fly3D",MB_OK|MB_ICONINFORMATION);
  40.         selrendermode=0;
  41.     }
  42.  
  43.     i=0;
  44.     numvideomodes=0;
  45.     while (EnumDisplaySettings(NULL,i,&videomodes[numvideomodes]))
  46.     {
  47.         if ((int)videomodes[numvideomodes].dmBitsPerPel==colorbits)
  48.             numvideomodes++;
  49.         i++;
  50.     }
  51.  
  52.     i=1;
  53.     j=DescribePixelFormat(hdc,i,sizeof(PIXELFORMATDESCRIPTOR),&rendermodes[i]);
  54.     numrendermodes=0;
  55.     while(i<j)
  56.     {
  57.         DescribePixelFormat(hdc,i,sizeof(PIXELFORMATDESCRIPTOR),&rendermodes[numrendermodes]);
  58.         if (rendermodes[numrendermodes].iPixelType==0 && 
  59.             rendermodes[numrendermodes].cColorBits==colorbits &&
  60.             (rendermodes[numrendermodes].dwFlags&PFD_DOUBLEBUFFER))
  61.             rendermodesindx[numrendermodes++]=i;
  62.         i++;
  63.     }
  64.  
  65.     if (selvideomode>numvideomodes)
  66.         selvideomode=0;
  67.     if (selrendermode>numrendermodes)
  68.         selrendermode=0;
  69.  
  70.     if (SetPixelFormat(hdc, rendermodesindx[selrendermode], &rendermodes[selrendermode]) == FALSE) 
  71.         return FALSE;
  72.  
  73.     m_hRC = wglCreateContext( hdc );
  74.     wglMakeCurrent( hdc, m_hRC );
  75.  
  76.     RECT rect;
  77.     GetClientRect(hFlyWnd,&rect);
  78.     ResizeView(rect.right,rect.bottom);
  79.  
  80.     glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
  81.     glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
  82.     glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
  83.  
  84.     glDisable(GL_LIGHTING);
  85.     glEnable(GL_POINT_SMOOTH);
  86.  
  87.     glPixelTransferf(GL_RED_SCALE,brightness);
  88.     glPixelTransferf(GL_GREEN_SCALE,brightness);
  89.     glPixelTransferf(GL_BLUE_SCALE,brightness);
  90.     
  91.     GetExtensions();
  92.  
  93.     glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV,&nregcomb);
  94.     glGetIntegerv(GL_MAX_LIGHTS,&nhwlights);
  95.     if (nhwlights>MAX_HWLIGHTS)
  96.         nhwlights=MAX_HWLIGHTS;
  97.  
  98.     glGetIntegerv(GL_DEPTH_BITS,&depthbits);
  99.     glGetIntegerv(GL_STENCIL_BITS,&stencilbits);
  100.     
  101.     glGetIntegerv(GL_ALPHA_BITS,&alphabits);
  102.     glGetIntegerv(GL_ACCUM_ALPHA_BITS,&i);
  103.     accumbits=i;
  104.     glGetIntegerv(GL_ACCUM_RED_BITS,&i);
  105.     accumbits+=i;
  106.     glGetIntegerv(GL_ACCUM_BLUE_BITS,&i);
  107.     accumbits+=i;
  108.     glGetIntegerv(GL_ACCUM_GREEN_BITS,&i);
  109.     accumbits+=i;
  110.  
  111.     return 1;
  112. }
  113.  
  114. void renderGL::DeleteView()
  115. {
  116.     if (m_hRC==0)
  117.         return;
  118.  
  119.     wglMakeCurrent(NULL, NULL);
  120.     wglDeleteContext(m_hRC);
  121.     m_hRC=0;
  122.  
  123.     ReleaseDC(hFlyWnd,hdc);
  124.     hdc=0;
  125. }
  126.  
  127. void renderGL::ResizeView(int sx,int sy)
  128. {
  129.     if (m_hRC==0)
  130.         return;
  131.     glViewport(0, 0, sx, sy);
  132.     if (sy==0)
  133.         flyengine->aspect=1;
  134.     else flyengine->aspect=(float)sx/sy;
  135.     screen_sx=sx;
  136.     screen_sy=sy;
  137. }
  138.  
  139. void renderGL::InitView()
  140. {
  141.     glClearColor( flyengine->background.x, flyengine->background.y, flyengine->background.z, 1 );
  142.     glClearDepth( 1 );
  143.  
  144.     if (flyengine->antialias)
  145.         glEnable(GL_LINE_SMOOTH);
  146.         
  147.     else
  148.         glDisable(GL_LINE_SMOOTH);
  149.  
  150.     glEnable(GL_CULL_FACE);
  151.     glCullFace(GL_BACK);
  152.  
  153.     glEnable(GL_DEPTH_TEST);
  154.     glDepthFunc(GL_LESS);
  155.     glDepthMask(GL_TRUE);
  156.  
  157.     glShadeModel(GL_SMOOTH);
  158.     glPolygonMode(GL_FRONT,flyengine->wireframe?GL_LINE:GL_FILL);
  159.     glPolygonMode(GL_BACK,flyengine->wireframe?GL_LINE:GL_FILL);
  160.     glPointSize(1.0f);
  161.  
  162.     glEnable(GL_TEXTURE_2D);
  163.  
  164.     vector c(1,1,1,1);
  165.     glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,&c.x);
  166.     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,&c.x);
  167.     glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,16);
  168.  
  169.     if (flyengine->fog)
  170.         {
  171.         glEnable(GL_FOG);
  172.         glFogi(GL_FOG_MODE,GL_LINEAR );
  173.         glFogf(GL_FOG_START,flyengine->viewmaxdist*0.7f);
  174.         glFogf(GL_FOG_END,flyengine->viewmaxdist);
  175.         flyengine->background.w=1;
  176.         glFogfv(GL_FOG_COLOR,&flyengine->background.x );
  177.         }
  178.     else glDisable(GL_FOG);
  179.  
  180.     glEnable(GL_BLEND);
  181.     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  182. }
  183.  
  184. void renderGL::DrawView()
  185. {
  186.     if (m_hRC==0)
  187.         return;
  188.     
  189.     int clear=GL_DEPTH_BUFFER_BIT;
  190.     if (flyengine->clearbk)
  191.         clear|=GL_COLOR_BUFFER_BIT;
  192.     if (flyengine->stencil)
  193.         clear|=GL_STENCIL_BUFFER_BIT;
  194.     InitView();
  195.     glClear( clear );
  196.  
  197.     if (flyengine->bsp && flyengine->cam && flyengine->player)
  198.         {
  199.         flyengine->cur_frame_base=++flyengine->cur_frame;
  200.         flyengine->dll.send_message(FLYM_DRAWSCENE,0,0);
  201.         
  202.         flyengine->start_text_mode();
  203.         if (flyengine->status)
  204.             flyengine->dll.send_message(FLYM_DRAWTEXT,0,0);
  205.         flyengine->end_text_mode();
  206.         }
  207.  
  208.     glFinish();
  209.     SwapBuffers(hdc);
  210. }
  211.  
  212. void renderGL::SetFullScreen()
  213. {
  214.     if (videomodes && selvideomode<numvideomodes)
  215.     {
  216.     if (fullscreen)
  217.         {
  218.         GetWindowRect(hFlyWnd,&winrect);
  219.         if (DISP_CHANGE_SUCCESSFUL==ChangeDisplaySettings(&videomodes[selvideomode],CDS_FULLSCREEN))
  220.             {
  221.             screen_sx=videomodes[selvideomode].dmPelsWidth;
  222.             screen_sy=videomodes[selvideomode].dmPelsHeight;
  223.             SetWindowLong(hFlyWnd,GWL_STYLE,WS_POPUP|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
  224.             ShowWindow(hFlyWnd,SW_SHOWMAXIMIZED);
  225.             }
  226.         else fullscreen=0;
  227.         }
  228.     else
  229.         {
  230.         ChangeDisplaySettings(NULL,CDS_FULLSCREEN);
  231.         SetWindowLong(hFlyWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
  232.         ShowWindow(hFlyWnd,SW_RESTORE);
  233.         SetWindowPos(hFlyWnd,HWND_TOP,winrect.left,winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,SWP_SHOWWINDOW);
  234.         }
  235.     }
  236. }
  237.  
  238. void renderGL::GetExtensions()
  239. {
  240.     char* pszExt;
  241.     pszExt = (char*)glGetString( GL_EXTENSIONS );
  242.     if (pszExt==0) return;
  243.  
  244.     if ( strstr(pszExt,"GL_ARB_multitexture") == 0 )
  245.         ntextureunits=1;
  246.     else
  247.     {
  248.     glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&ntextureunits);
  249.     glMultiTexCoord2iARB =
  250.         (PFNGLMULTITEXCOORD2IARBPROC)
  251.         wglGetProcAddress("glMultiTexCoord2iARB");
  252.     glMultiTexCoord3fARB =
  253.         (PFNGLMULTITEXCOORD3FARBPROC)
  254.         wglGetProcAddress("glMultiTexCoord3fARB");
  255.     glMultiTexCoord3fvARB =
  256.         (PFNGLMULTITEXCOORD3FVARBPROC)
  257.         wglGetProcAddress("glMultiTexCoord3fvARB");
  258.     glActiveTextureARB =
  259.         (PFNGLACTIVETEXTUREARBPROC)
  260.         wglGetProcAddress("glActiveTextureARB");
  261.     glMultiTexCoord2fvARB = 
  262.         (PFNGLMULTITEXCOORD2FVARBPROC)
  263.         wglGetProcAddress("glMultiTexCoord2fvARB");
  264.     glMultiTexCoord2fARB = 
  265.         (PFNGLMULTITEXCOORD2FARBPROC)
  266.         wglGetProcAddress("glMultiTexCoord2fARB");
  267.     }
  268.  
  269.     if ( strstr(pszExt,"GL_NV_register_combiners") )
  270.     {
  271.     glCombinerParameterfvNV =
  272.         (PFNGLCOMBINERPARAMETERFVNVPROC)
  273.         wglGetProcAddress("glCombinerParameterfvNV");
  274.     glCombinerParameterivNV =
  275.         (PFNGLCOMBINERPARAMETERIVNVPROC)
  276.         wglGetProcAddress("glCombinerParameterivNV");
  277.     glCombinerParameterfNV =
  278.         (PFNGLCOMBINERPARAMETERFNVPROC)
  279.         wglGetProcAddress("glCombinerParameterfNV");
  280.     glCombinerParameteriNV =
  281.         (PFNGLCOMBINERPARAMETERINVPROC)
  282.         wglGetProcAddress("glCombinerParameteriNV");
  283.     glCombinerInputNV =
  284.         (PFNGLCOMBINERINPUTNVPROC)
  285.         wglGetProcAddress("glCombinerInputNV");
  286.     glCombinerOutputNV =
  287.         (PFNGLCOMBINEROUTPUTNVPROC)
  288.         wglGetProcAddress("glCombinerOutputNV");
  289.     glFinalCombinerInputNV =
  290.         (PFNGLFINALCOMBINERINPUTNVPROC)
  291.         wglGetProcAddress("glFinalCombinerInputNV");
  292.     glGetCombinerInputParameterfvNV =
  293.         (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)
  294.         wglGetProcAddress("glGetCombinerInputParameterfvNV");
  295.     glGetCombinerInputParameterivNV =
  296.         (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)
  297.         wglGetProcAddress("glGetCombinerInputParameterivNV");
  298.     glGetCombinerOutputParameterfvNV =
  299.         (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)
  300.         wglGetProcAddress("glGetCombinerOutputParameterfvNV");
  301.     glGetCombinerOutputParameterivNV =
  302.         (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)
  303.         wglGetProcAddress("glGetCombinerOutputParameterivNV");
  304.     glGetFinalCombinerInputfvNV =
  305.         (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)
  306.         wglGetProcAddress("glGetFinalCombinerInputfvNV");
  307.     glGetFinalCombinerInputivNV =
  308.         (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)
  309.         wglGetProcAddress("glGetFinalCombinerInputivNV");
  310.     }
  311. }